import { Controller, Get, Param } from '@nestjs/common';
import { AppService } from './app.service';


/**
 * 
 * 1. Controller (router )
职责: 负责处理 HTTP 请求 和 响应。它是应用程序的入口点，用于接收客户端请求并返回响应。

特点:

使用 @Controller() 装饰器定义。

包含路由处理方法（如 @Get()、@Post() 等）。

通常不直接处理业务逻辑，而是调用 Service 来完成具体任务。

使用场景: 用于构建 RESTful API 或处理 HTTP 请求。

示例:

typescript
复制
@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }
}

 */
@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }

  @Get('hello/:name')
  getHelloName(@Param('name') name: string): string {
    return this.appService.getHelloName(name);
  }
}


/** 
 * 
 *  Provider（提供者）
1.1 定义
Provider 是 NestJS 中用于提供可注入依赖项的类或对象。

它可以是服务（Service）、仓库（Repository）、工厂（Factory）、值（Value）等。

Provider 通过 NestJS 的依赖注入系统被注入到其他类中（如 Controller、Resolver 或其他 Provider）。

1.2 特点
使用 @Injectable() 装饰器标记为可注入的类。

可以是单例（默认），也可以是请求作用域（request-scoped）。

可以通过构造函数注入到其他类中。

1.3 类型
Class Provider:

最常见的 Provider 类型，通常是一个服务类。

示例：

typescript
复制
@Injectable()
export class UsersService {
  findAll(): string {
    return 'All users';
  }
}
Value Provider:

提供一个固定的值或对象。

示例：

typescript
复制
const mockUserService = {
  findAll: () => ['user1', 'user2'],
};

@Module({
  providers: [
    {
      provide: 'MOCK_USER_SERVICE',
      useValue: mockUserService,
    },
  ],
})
export class AppModule {}
Factory Provider:

通过工厂函数动态创建 Provider。

示例：

typescript
复制
@Injectable()
export class ConfigService {
  getConfig() {
    return { env: 'development' };
  }
}

@Module({
  providers: [
    {
      provide: 'CONFIG',
      useFactory: (configService: ConfigService) => configService.getConfig(),
      inject: [ConfigService],
    },
  ],
})
export class AppModule {}
Alias Provider:

为现有的 Provider 提供别名。

示例：

typescript
复制
@Module({
  providers: [
    UsersService,
    {
      provide: 'ALIAS_USER_SERVICE',
      useExisting: UsersService,
    },
  ],
})
export class AppModule {}
1.4 使用场景
封装业务逻辑（如 Service）。

提供工具函数或工具类。

提供数据库访问层（如 Repository）。

提供配置或常量值。

2. Module（模块）
2.1 定义
Module 是 NestJS 中用于组织应用程序结构的核心单元。

每个模块封装了一组相关的功能（如 Controller、Provider 等）。

模块可以导入其他模块，也可以导出自己的功能供其他模块使用。

2.2 特点
使用 @Module() 装饰器定义。

包含以下属性：

providers: 注册本模块的 Provider。

controllers: 注册本模块的 Controller。

imports: 导入其他模块。

exports: 导出本模块的 Provider，供其他模块使用。

2.3 类型
根模块（Root Module）:

应用程序的入口模块，通常命名为 AppModule。

示例：

typescript
复制
@Module({
  imports: [UsersModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
功能模块（Feature Module）:

封装特定功能的模块（如用户模块、订单模块）。

示例：

typescript
复制
@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}
共享模块（Shared Module）:

提供可复用的功能（如数据库连接、工具类）。

示例：

typescript
复制
@Module({
  providers: [DatabaseService],
  exports: [DatabaseService],
})
export class DatabaseModule {}
全局模块（Global Module）:

使用 @Global() 装饰器标记，全局可用，无需显式导入。

示例：

typescript
复制
@Global()
@Module({
  providers: [ConfigService],
  exports: [ConfigService],
})
export class ConfigModule {}
动态模块（Dynamic Module）:

提供动态配置的模块，通常用于库或插件。

示例：

typescript
复制
@Module({})
export class DatabaseModule {
  static forRoot(options: DatabaseOptions): DynamicModule {
    return {
      module: DatabaseModule,
      providers: [
        {
          provide: 'DATABASE_OPTIONS',
          useValue: options,
        },
        DatabaseService,
      ],
      exports: [DatabaseService],
    };
  }
}
2.4 使用场景
组织应用程序的功能模块。

封装和复用功能（如数据库模块、配置模块）。

实现模块间的依赖管理。

3. Provider 和 Module 的关系
Provider 是模块的核心组成部分，模块通过 providers 属性注册 Provider。

Module 是 Provider 的容器，负责管理 Provider 的生命周期和作用域。

模块可以通过 exports 属性将 Provider 暴露给其他模块使用。

4. 示例：完整流程
4.1 定义 Provider
typescript
复制
@Injectable()
export class UsersService {
  findAll(): string {
    return 'All users';
  }
}
4.2 定义 Module
typescript
复制
@Module({
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService], // 导出 UsersService，供其他模块使用
})
export class UsersModule {}
4.3 使用 Provider
typescript
复制
@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll(): string {
    return this.usersService.findAll();
  }
}
4.4 导入 Module
typescript
复制
@Module({
  imports: [UsersModule], // 导入 UsersModule
})
export class AppModule {}
5. 总结
Provider 是 NestJS 中提供依赖项的核心单元，可以是服务、值、工厂等。

Module 是组织应用程序结构的核心单元，负责管理 Provider 和其他组件。

通过合理使用 Provider 和 Module，可以实现应用程序的模块化、可维护性和可扩展性。
 */